package Heap.LeetCode;

import java.util.*;

public class Num17_14_SmallestK {
    public int[] smallest(int[] arr,int k){
        if(arr.length==0||k==0){
            return new int[0];
        }
        //构造一个最大堆，JDK默认是最小堆，使用比较器改造为最大堆
        Queue<Integer> queue=new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        //扫描原数组，优先级队列中只存储k个值
        for (int i : arr ) {
            if(queue.size()<k){
                queue.offer(i);
            }else{
                //判断扫描元素和堆顶元素的关系
                int peak=queue.peek();
                if(i>peak){
                    continue;
                }else {
                    //此时当前元素<堆顶元素，将堆顶元素出队，将较小元素i入队
                    queue.poll();
                    queue.offer(i);
                }
            }
        }
        //此时最大堆中就保存了最小的k个数
        int[] ret=new int[k];
        for (int i = 0; i < k; i++) {
            ret[i]=queue.poll();
        }
        return ret;
    }

}
